home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / tnos / tnos100s / nr4.h < prev    next >
C/C++ Source or Header  |  1992-03-24  |  9KB  |  275 lines

  1. #ifndef    _NR4_H
  2. #define    _NR4_H
  3. /* nr4.h:  defines for netrom layer 4 (transport) support */
  4.  
  5. #ifndef    _MBUF_H
  6. #include "mbuf.h"
  7. #endif
  8.  
  9. #ifndef    _TIMER_H
  10. #include "timer.h"
  11. #endif
  12.  
  13. #ifndef    _AX25_H
  14. #include "ax25.h"
  15. #endif
  16.  
  17. /* compile-time limitations */
  18.  
  19. #define    NR4MAXCIRC    20        /* maximum number of open circuits */
  20. #define NR4MAXWIN    127        /* maximum window size, send and receive */
  21.  
  22. /* protocol limitation: */
  23.  
  24. #define    NR4MAXINFO    236        /* maximum data in an info packet */
  25.  
  26. /* sequence number wraparound mask */
  27.  
  28. #define NR4SEQMASK    0xff    /* eight-bit sequence numbers */
  29.  
  30. /* flags in high nybble of opcode byte */
  31.  
  32. #define    NR4CHOKE    0x80
  33. #define    NR4NAK        0x40
  34. #define    NR4MORE        0x20    /* The "more follows" flag for */
  35.                             /* pointless packet reassembly */
  36.  
  37. /* mask for opcode nybble */
  38.  
  39. #define    NR4OPCODE    0x0f
  40.  
  41. /* opcodes */
  42.  
  43. #define NR4OPPID    0        /* protocol ID extension to network layer */
  44. #define    NR4OPCONRQ    1        /* connect request */
  45. #define    NR4OPCONAK    2        /* connect acknowledge */
  46. #define    NR4OPDISRQ    3        /* disconnect request */
  47. #define    NR4OPDISAK    4        /* disconnect acknowledge */
  48. #define    NR4OPINFO    5        /* information packet */
  49. #define    NR4OPACK    6        /* information ACK */
  50. #define NR4NUMOPS    7        /* number of transport opcodes */
  51.  
  52. /* minimum length of NET/ROM transport header */
  53.  
  54. #define    NR4MINHDR    5
  55.  
  56. /* host format net/rom transport header */
  57.  
  58. struct nr4hdr {
  59.     unsigned char opcode ;        /* opcode and flags */
  60.     unsigned char yourindex ;    /* receipient's circuit index */
  61.     unsigned char yourid ;        /* receipient's circuit ID */
  62.  
  63.     union {
  64.  
  65.         struct {                /* network extension */
  66.             unsigned char family ;    /* protocol family */
  67.             unsigned char proto ;    /* protocol within family */
  68.         } pid ;
  69.  
  70.         struct {                /* connect request */
  71.             unsigned char myindex ;    /* sender's circuit index */
  72.             unsigned char myid ;    /* sender's circuit ID */
  73.             unsigned char window ;    /* sender's proposed window size */
  74.             char user[AXALEN] ;    /* callsign of originating user */
  75.             char node[AXALEN] ;    /* callsign of originating node */
  76.         } conreq ;
  77.  
  78.         struct {                /* connect acknowledge */
  79.             unsigned char myindex ;    /* sender's circuit index */
  80.             unsigned char myid ;    /* sender's circuit ID */
  81.             unsigned char window ;     /* accepted window size */
  82.         } conack ;
  83.  
  84.         struct {                /* information */
  85.             unsigned char txseq ;    /* sender's tx sequence number */
  86.             unsigned char rxseq ;    /* sender's rx sequence number */
  87.         } info ;
  88.  
  89.         struct {                /* information acknowledge */
  90.             unsigned char rxseq ;    /* sender's rx sequence number */
  91.         } ack ;
  92.  
  93.     } u ;    /* End of union */
  94.  
  95. } ;
  96.  
  97. /* A netrom send buffer structure */
  98.  
  99. struct nr4txbuf {
  100.     struct timer tretry ;        /* retry timer */
  101.     unsigned retries ;            /* number of retries */
  102.     struct mbuf *data ;            /* data sent but not acknowledged */
  103. } ;
  104.  
  105. /* A netrom receive buffer structure */
  106.  
  107. struct nr4rxbuf {
  108.     unsigned char occupied ;    /* flag: buffer in use */
  109.     struct mbuf *data ;         /* data received out of sequence */
  110. } ;
  111.  
  112. /* address structure */
  113. struct nr4_addr {
  114.     char user[AXALEN];
  115.     char node[AXALEN];
  116. };
  117. #define    NULLNRADDR    (struct nr4_addr *)0
  118.  
  119. struct sockaddr_nr {
  120.     short nr_family;
  121.     struct nr4_addr nr_addr;
  122. };
  123.  
  124. /* The netrom circuit control block */
  125.  
  126. struct nr4cb {
  127.     unsigned mynum ;            /* my circuit number */
  128.     unsigned myid ;                /* my circuit ID */
  129.     unsigned yournum ;            /* remote circuit number */
  130.     unsigned yourid ;            /* remote circuit ID */
  131.     struct nr4_addr remote ;        /* address of remote node */
  132.     struct nr4_addr local ;            /* our own address */
  133.  
  134.     unsigned window ;            /* negotiated window size */
  135.  
  136.     /* Data for round trip timer calculation and setting */
  137.  
  138.     long srtt ;                    /* Smoothed round trip time */
  139.     long mdev ;                    /* Mean deviation in round trip time */
  140.     unsigned blevel ;            /* Backoff level */
  141.     unsigned txmax ;            /* The maximum number of retries among */
  142.                                 /* the frames in the window.  This is 0 */
  143.                                 /* if there are no frames in the window. */
  144.                                 /* It is used as a baseline to determine */
  145.                                 /* when to increment the backoff level. */
  146.  
  147.     /* flags */
  148.  
  149.     char clone ;                /* clone this cb upon connect */
  150.     char choked ;                /* choke received from remote */
  151.     char qfull ;                /* receive queue is full, and we have */
  152.                                 /* choked the other end */
  153.     char naksent ;                /* a NAK has already been sent */
  154.  
  155.     /* transmit buffers and window variables */
  156.  
  157.     struct nr4txbuf *txbufs ;    /* pointer to array[windowsize] of bufs */
  158.     unsigned char nextosend ;    /* sequence # of next frame to send */
  159.     unsigned char ackxpected ;    /* sequence number of next expected ACK */
  160.     unsigned nbuffered ;        /* number of buffered TX frames */
  161.     struct mbuf *txq ;            /* queue of unsent data */
  162.  
  163.     /* receive buffers and window variables */
  164.  
  165.     struct nr4rxbuf *rxbufs ;    /* pointer to array[windowsize] of bufs */
  166.     unsigned char rxpected ;    /* # of next receive frame expected */
  167.     unsigned char rxpastwin ;    /* top of RX window + 1 */
  168.     struct mbuf *rxq ;            /* "fully" received data queue */
  169.  
  170.     /* Connection state */
  171.  
  172.     int state ;                    /* connection state */
  173. #define NR4STDISC    0            /* disconnected */
  174. #define NR4STCPEND    1            /* connection pending */
  175. #define NR4STCON    2            /* connected */
  176. #define    NR4STDPEND    3            /* disconnect requested locally */
  177. #define NR4STLISTEN    4            /* listening for incoming connections */
  178.  
  179.     int dreason ;                /* Reason for disconnect */
  180. #define NR4RNORMAL    0            /* Normal, requested disconnect */
  181. #define NR4RREMOTE    1            /* Remote requested */
  182. #define    NR4RTIMEOUT    2            /* Connection timed out */
  183. #define    NR4RRESET    3            /* Connection reset locally */
  184. #define NR4RREFUSED    4            /* Connect request refused */
  185.  
  186.     /* Per-connection timers */
  187.  
  188.     struct timer tchoke ;        /* choke timeout */
  189.     struct timer tack ;         /* ack delay timer */
  190.     struct timer tdisc ;        /* Inactivity timer - WG7J */
  191.  
  192.     struct timer tcd ;          /* connect/disconnect timer */
  193.     unsigned cdtries ;          /* Number of connect/disconnect tries */
  194.  
  195.     void (*r_upcall) __ARGS((struct nr4cb *,int16));
  196.                     /* receive upcall */
  197.     void (*t_upcall) __ARGS((struct nr4cb *,int16));
  198.                     /* transmit upcall */
  199.     void (*s_upcall) __ARGS((struct nr4cb *,int,int));
  200.                     /* state change upcall */
  201.     int user ;            /* user linkage area */
  202. } ;
  203.  
  204. #define    NULLNR4CB    (struct nr4cb *)0
  205.  
  206. /* The netrom circuit pointer structure */
  207.  
  208. struct nr4circp {
  209.     unsigned char cid ;            /* circuit ID; incremented each time*/
  210.                                 /* this circuit is used */
  211.     struct nr4cb *ccb ;            /* pointer to circuit control block, */
  212.                                 /*  NULLNR4CB if not in use */
  213. } ;
  214.  
  215. /* The circuit table: */
  216.  
  217. extern struct nr4circp Nr4circuits[NR4MAXCIRC] ;
  218.  
  219. /* Some globals */
  220.  
  221. extern unsigned short Nr4window ;    /* The advertised window size, in frames */
  222. extern long Nr4irtt ;            /* The initial round trip time */
  223. extern unsigned short Nr4retries ;    /* The number of times to retry */
  224. extern long Nr4acktime ;        /* How long to wait until ACK'ing */
  225. extern char *Nr4states[] ;        /* NET/ROM state names */
  226. extern char *Nr4reasons[] ;        /* Disconnect reason names */
  227. extern unsigned short Nr4qlimit ;        /* max receive queue length before CHOKE */
  228. extern long Nr4choketime ;        /* CHOKEd state timeout */
  229. extern char Nr4user[AXALEN];    /* User callsign in outgoing connects */
  230.  
  231. /* function definitions */
  232.  
  233. /* In nr4hdr.c: */
  234. int ntohnr4 __ARGS((struct nr4hdr *, struct mbuf **));
  235. struct mbuf *htonnr4 __ARGS((struct nr4hdr *));
  236.  
  237. /* In nr4subr.c: */
  238. void free_n4circ __ARGS((struct nr4cb *));
  239. struct nr4cb *get_n4circ __ARGS((int, int));
  240. int init_nr4window __ARGS((struct nr4cb *, unsigned));
  241. int nr4between __ARGS((unsigned, unsigned, unsigned));
  242. struct nr4cb *match_n4circ __ARGS((int, int,char *,char *));
  243. struct nr4cb *new_n4circ __ARGS((void));
  244. void nr4defaults __ARGS((struct nr4cb *));
  245. int nr4valcb __ARGS((struct nr4cb *));
  246. void nr_garbage __ARGS((int red));
  247.  
  248. /* In nr4.c: */
  249. void nr4input __ARGS((struct nr4hdr *hdr,struct mbuf *bp));
  250. int nr4output __ARGS((struct nr4cb *));
  251. void nr4sbuf __ARGS((struct nr4cb *, unsigned));
  252. void nr4sframe __ARGS((char *, struct nr4hdr *, struct mbuf *));
  253. void nr4state __ARGS((struct nr4cb *, int));
  254.  
  255. /* In nr4timer.c */
  256. void nr4ackit __ARGS((void *));
  257. void nr4cdtimeout __ARGS((void *));
  258. void nr4txtimeout __ARGS((void *));
  259. void nr4unchoke __ARGS((void *));
  260.  
  261. /* In nr4user.c: */
  262. void disc_nr4 __ARGS((struct nr4cb *));
  263. int kick_nr4 __ARGS((struct nr4cb *));
  264. struct nr4cb *open_nr4 __ARGS((struct nr4_addr *, struct nr4_addr *, int,
  265.   void (*)(), void (*)(), void (*)(),int));
  266. struct mbuf *recv_nr4 __ARGS((struct nr4cb *, int16));
  267. void reset_nr4 __ARGS((struct nr4cb *));
  268. int send_nr4 __ARGS((struct nr4cb *, struct mbuf *));
  269.  
  270. /* In nrcmd.c: */
  271. void nr4_state __ARGS((struct nr4cb *, int, int));
  272. void donodetick __ARGS((void));     /* called from remote kick proc now */
  273.  
  274. #endif    /* _NR4_H */
  275.